Modified gtk_tree_view_move_cursor_up_down to move focus inside the cell area
authorTristan Van Berkom <tristan.van.berkom@gmail.com>
Thu, 9 Dec 2010 09:01:16 +0000 (18:01 +0900)
committerKristian Rietveld <kris@gtk.org>
Sun, 12 Dec 2010 16:21:28 +0000 (17:21 +0100)
This currently leaves us the problem of maintaining the right cell in
focus for horizontal areas, the solution for that comming in the
next patch.

gtk/gtktreeview.c

index a1820d4271aaf4a31ebe7a2fcbe2aa12214b4e1f..b624d25612e70e7eae6a48f773fefff51d12a128 100644 (file)
@@ -10101,6 +10101,9 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
   GtkTreePath *cursor_path = NULL;
   gboolean grab_focus = TRUE;
   gboolean selectable;
+  GtkDirectionType direction;
+  GtkCellArea *cell_area = NULL;
+  GtkTreeIter iter;
 
   if (! gtk_widget_has_focus (GTK_WIDGET (tree_view)))
     return;
@@ -10118,6 +10121,26 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
     /* FIXME: we lost the cursor; should we get the first? */
     return;
 
+  direction = count < 0 ? GTK_DIR_UP : GTK_DIR_DOWN;
+
+
+  if (tree_view->priv->focus_column)
+    cell_area = gtk_cell_layout_get_area (GTK_CELL_LAYOUT (tree_view->priv->focus_column));
+
+  /* If focus stays in the area for this row, then just return for this round */
+  if (cell_area && (count == -1 || count == 1) &&
+      gtk_tree_model_get_iter (tree_view->priv->model, &iter, cursor_path))
+    {
+      gtk_tree_view_column_cell_set_cell_data (tree_view->priv->focus_column,
+                                              tree_view->priv->model,
+                                              &iter,
+                                              GTK_RBNODE_FLAG_SET (cursor_node, GTK_RBNODE_IS_PARENT),
+                                              cursor_node->children?TRUE:FALSE);
+      
+      if (gtk_cell_area_focus (cell_area, direction))
+       return;
+    }
+
   selection_count = gtk_tree_selection_count_selected_rows (tree_view->priv->selection);
   selectable = _gtk_tree_selection_row_is_selectable (tree_view->priv->selection,
                                                      cursor_node,
@@ -10189,6 +10212,10 @@ gtk_tree_view_move_cursor_up_down (GtkTreeView *tree_view,
       cursor_path = _gtk_tree_view_find_path (tree_view, new_cursor_tree, new_cursor_node);
       gtk_tree_view_real_set_cursor (tree_view, cursor_path, TRUE, TRUE);
       gtk_tree_path_free (cursor_path);
+
+      /* Give focus to the area in the new row */
+      if (cell_area)
+       gtk_cell_area_focus (cell_area, direction);
     }
   else
     {